package com.ujson.base.domain.entity;

import javax.validation.constraints.NotNull;

public interface Repository<T extends Aggregate<ID>, ID extends Identifier> {

    /**
     * 将一个Aggregate附加到一个repository，让他变为可追踪
     * @param aggregate
     */
    void attach(@NotNull T aggregate);

    /**
     * 解除一个Aggregate的追踪
     * @param aggregae
     */
    void detach(@NotNull T aggregae);

    /**
     * 通过ID查找Aggregate
     * 找到的Aggregate自动是可追踪的
     * @param id
     * @return
     */
    T find(@NotNull ID id);

    /**
     * 将一个Aggregate从repository中移除
     * 操作后的aggregate自动取消追踪
     * @param aggregate
     */
    void remove(@NotNull T aggregate);

    /**
     * 保存一个Aggregate
     * 保存后自动重置追踪条件
     * @param aggregate
     */
    void save(@NotNull T aggregate);

}
